package com.carl.main;


import com.carl.mapper.BaiduNewsMapper;
import com.carl.model.BaiduNews;
import com.carl.utils.MybatisHelper;
import org.apache.ibatis.session.SqlSession;
import org.jsoup.Jsoup;
import org.jsoup.nodes.Document;
import org.jsoup.nodes.Element;
import org.jsoup.select.Elements;

import java.io.IOException;


public class BaiduNewsCrawler {
    public static void main(String[] args) throws IOException {
        // 获取sqlSession
        SqlSession sqlSession = MybatisHelper.getSqlSessionLocal();
        // 注入要操作的表的mapper, 方便单表操作
        BaiduNewsMapper baiduNewsMapper = sqlSession.getMapper(BaiduNewsMapper.class);
        // 分析网站结构, 获取数据并入库
        // 要抓取的url
        String url = "http://top.baidu.com/buzz?b=1";
        // 使用爬虫库获取
        Document doc = Jsoup.connect(url).get();
        getElementAndInsert(doc, baiduNewsMapper, "实时热点");

        // 获取新闻列表
        Elements lis = doc.select("#flist li");
        for (int i = 2; i < lis.size(); i++) {
            Element li = lis.get(i);
            // title = type
            String title = li.select("a").attr("title");
            String href = "http://top.baidu.com" + li.select("a").attr("href").substring(1);
            doc = Jsoup.connect(href).get();
            getElementAndInsert(doc, baiduNewsMapper, title);
        }
        // 提交事务
        sqlSession.commit();
        //  关流
        sqlSession.close();
    }

    public static void getElementAndInsert(Document doc, BaiduNewsMapper baiduNewsMapper, String type) {
        // 使用元素选择器获取对应的html元素
        Elements trs = doc.select("#main > div.mainBody > div > table tr");
        // 遍历获取需要值
        for (Element tr : trs) {
            // 获取页面上需要值
            String keyword = tr.select(".list-title").text();
            String clazz = tr.select(".tc").text();
            // 这个变量控制数据是否可用
            String tempNum = tr.select(".last").text();
            int num;
            try {
                num = Integer.parseInt(tempNum);
            } catch (NumberFormatException e) {
                System.out.println("Debug");
                // 非数字的字符串, 全部跳过
                continue;
            }
            // 封装到po对象中
            BaiduNews baiduNews = new BaiduNews();
            baiduNews.setKeyword(keyword);
            baiduNews.setClazz(clazz);
            baiduNews.setSearchNum(num);
            // 数据还未获取, 待完成
            baiduNews.setType(type);
            //  入库
            baiduNewsMapper.insert(baiduNews);
            System.out.println("入库: " + keyword);
        }
    }
}
